# 2.1所有半角转全角，不是半角范围直接返回，空格半角特殊单独处理，其它半角和全角对应公式：半角 = 全角 - 0xfee0
# from ling_python_common.demo.dict import setAndSortList

#
# # 汉字的unicode编码范围 u4e00 到 u9fa5。
# def is_chinese(uchar):
#     """判断一个unicode是否是汉字"""
#     if uchar >= u'\u4e00' and uchar <= u'\u9fa5':
#         return True
#     else:
#         return False
#
#
# # 1.2数字0-9的判断
# # 数字的unicode编码范围根据全角和半角，有两个不同区域，半角数字 u0030 到 u0039，全角数字 uff10 到 uff19。
# def is_number(uchar):
#     """判断一个unicode是否是半角数字"""
#     if uchar >= u'\u0030' and uchar <= u'\u0039':
#         return True
#     else:
#         return False
#
#
# def is_Qnumber(uchar):
#     """判断一个unicode是否是全角数字"""
#     if uchar >= u'\uff10' and uchar <= u'\uff19':
#         return True
#     else:
#         return False
#
#
# # 1.3大小写字母判断
# # 字母的unicode编码根据字母大小写，以及全角和半角共有四个区域。
# # 半角大写字母：u0041 - u005a ，半角小写字母：u0061 - u007a ；
# # 全角大写字母：uff21 - uff3a ， 全角小写字母：uff41 - uff5a 。
#
# def is_alphabet(uchar):
#     """判断一个unicode是否是半角英文字母"""
#     if (uchar >= u'\u0041' and uchar <= u'\u005a') or (uchar >= u'\u0061' and uchar <= u'\u007a'):
#         return True
#     else:
#         return False
#
#
# def is_Qalphabet(uchar):
#     """判断一个unicode是否是全角英文字母"""
#     if (uchar >= u'\uff21' and uchar <= u'\uff3a') or (uchar >= u'\uff41' and uchar <= u'\uff5a'):
#         return True
#     else:
#         return False
#
#
# # 1.4非汉字和数字字母的判断判断除汉字、数字0 - 9、字母之外的字符。
#
# def is_other(uchar):
#     """判断是否非汉字，数字和英文字符"""
#     if not (is_chinese(uchar) or is_number(uchar) or is_alphabet(uchar)):
#         return True
#     else:
#         return False


# def B2Q(uchar):
#     """单个字符 半角转全角"""
#     inside_code = ord(uchar)
#     if inside_code < 0x0020 or inside_code > 0x7e:  # 不是半角字符就返回原来的字符
#         return uchar
#     if inside_code == 0x0020:  # 除了空格其他的全角半角的公式为: 半角 = 全角 - 0xfee0
#         inside_code = 0x3000
#     else:
#         inside_code += 0xfee0
#     return chr(inside_code)


# 2.2所有全角转半角，和前面正好相反，公式对应：全角 = 半角 + 0xfee0

# def Q2B(uchar):
#     """单个字符 全角转半角"""
#     inside_code = ord(uchar)
#     if inside_code == 0x3000:
#         inside_code = 0x0020
#     else:
#         inside_code -= 0xfee0
#     if inside_code < 0x0020 or inside_code > 0x7e:  # 转完之后不是半角字符返回原来的字符
#         return uchar
#     return chr(inside_code)

# 2.3把整个字符串全角转半角，也可以只转部分如数字和字母

# def stringQ2B(ustring):
#     """把字符串全角转半角"""
#     return "".join([Q2B(uchar) for uchar in ustring])
#
# def stringpartQ2B(ustring):
#     """把字符串中数字和字母全角转半角"""
#     return "".join([Q2B(uchar) if is_Qnumber(uchar) or is_Qalphabet(uchar) else uchar for uchar in ustring])


# 全角字符unicode编码从65281~65374 （十六进制 0xFF01 ~ 0xFF5E）
# 半角字符unicode编码从33~126 （十六进制 0x21~ 0x7E）
# 空格比较特殊,全角为 12288（0x3000）,半角为 32 （0x20）
# 而且除空格外,全角/半角按unicode编码排序在顺序上是对应的
# 所以可以直接通过用+-法来处理非空格数据,对空格单独处理
# 全角即：Double Byte Character，简称：Q
# 半角即：Single Byte Character，简称：B

def Q2B(ustring):
    """全角转半角"""
    rstring = ""
    for uchar in ustring:
        inside_code = ord(uchar)
        if inside_code == 0x3000:
            inside_code = 0x0020
        else:
            inside_code -= 0xfee0
        if not (0x0021 <= inside_code and inside_code <= 0x7e):
            rstring += uchar
            continue
        rstring += chr(inside_code)
    return rstring


def B2Q(ustring):
    """半角转全角"""
    rstring = ""
    for uchar in ustring:
        inside_code = ord(uchar)
        if inside_code == 0x0020:
            inside_code = 0x3000
        else:
            if not (0x0021 <= inside_code and inside_code <= 0x7e):
                rstring += uchar
                continue
        inside_code += 0xfee0
        rstring += chr(inside_code)
    return rstring


def testQB():
    results = []
    with open('D:/workspace/python/train_data/train_data_configs/words/QB.txt', 'r', encoding='utf-8') as f:
        lines = f.readlines();
        for line in lines:
            newLine = Q2B(line);
            results.append(newLine)
            # 循环引用导致import 错误
    # results = setAndSortList(results);

    with open("D:/workspace/python/train_data/train_data_configs/words/QB_result.txt", 'wb') as c_all:
        c_all.truncate()
        for result in results:
            c_all.write(result.encode('utf-8'))


if __name__ == '__main__':
    testQB()
